/*
package com.mmall.controller.portal;

import com.mmall.common.IConst;
import com.mmall.common.ResponseInfo;
import com.mmall.common.ServerResponse;
import com.mmall.pojo.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;

*/
/**
 * Controller层代理测试
 * Controller层的AspectJ代理测试了好多次才成功．
 * 主要被idea自带的生成新建－－Aspect，Aspectj Support插件干扰了很久．
 * 这种生成public aspect Login{．．．}这种.aj的文件写法和用法与普通代理不同．
 * <p>
 * 然后，关于控制层的代理要注意的几点：
 * 1.Spring容器和Spring MVC容器为父子容器关系，先加载父容器再加载子容器．理解Spring容器的加载顺序是理解这个问题的关键。
 * 2.所以如果父子容器都解析控制层类，但是只有父容器中设置了<aop:aspectj-autoproxy/>,则不能实现代理，因为会优先使用MVC中的控制层类。
 * 3.最安全且实用的方法是，在Spring容器中不加载Controller层的Bean，只在MVC容器中加载Controller层，并单独配置自己的AspectJ代理。
 * 4.所以在项目开发中，最好是明确职责边界，Spring-application-config.xml只负责核心的Bean初始化；
 * springmvc-servlet-config.xml只负责和mvc相关的bean：比如Controller、HandlerMapping、HandlerAdapter.
 * <p>
 * Created by qezhhnjy on 2017/10/14-12:05.
 *//*

@Component
@Aspect
public class Login {

    private static org.slf4j.Logger logger = LoggerFactory.getLogger(Login.class);

    static {
        System.out.println("Controller层代理测试");
    }

    //执行com.mmall.controller.portal包中方法名为login外的方法.
    @Pointcut("execution(public * com.mmall.controller.portal..*(..,javax.servlet.http.HttpSession,..)) && !execution(* *.login(..))")
    private void test() {
    }

    @Before("test()")
    public void tm(){}

    //这里好奇怪使用&& args(..,session,..)会报错,提示不能用两个'..',执行也会报错.
    //由于前端页面没有使用json接收,所以这里使用页面测试会出现无法转型的异常.
    @Around(value = "test() && (args(..,session) || args(session,..))", argNames = "pjp,session")
    public ServerResponse tt(ProceedingJoinPoint pjp, HttpSession session) {
        logger.info("Controller层用户登录验证AspectJ");
        User user = (User) session.getAttribute(IConst.CURRENT_USER);
        if (user != null) try {
            return (ServerResponse) pjp.proceed();
        } catch (Throwable throwable) {
            logger.error("用户登录验证代理异常!", throwable);
        }
        else
            return ServerResponse.createByErrorCode(ResponseInfo.NEED_LOGIN.getCode(), ResponseInfo.NEED_LOGIN.getDescription());
        return ServerResponse.createByErrorMessage("好像有点问题!");
    }
}
*/
